#include "DatoIndice.h"

DatoIndice::DatoIndice(SecondaryKey *secondaryKey, PrimaryKey *primaryKey)
{
	this->secondaryKey=secondaryKey;
	this->primaryKey=primaryKey;
}

int DatoIndice::CompararClave(char *DatoBuscado, char *InformacionIndexada)
{
	char* claveBuscada=(char*) malloc(GetTamanioClave());
	CargaClave(claveBuscada,DatoBuscado);


	int comparacion=memcmp(claveBuscada,InformacionIndexada,GetTamanioClave());

	free(claveBuscada);

	return comparacion;
}

int DatoIndice::CompararID(char *DatoBuscado, char *InformacionIndexada)
{
	char* IDBuscada=(char*) malloc(GetTamanioID());
	CargarID(IDBuscada,DatoBuscado,0);

	int comparacion=memcmp(IDBuscada,InformacionIndexada+GetTamanioClave(),GetTamanioID());

	free(IDBuscada);

	return comparacion;
}
/*
int DatoIndice::CompararID(int IdBuscado,int IdIndexado)
{
	char* IDBuscada=(char*) malloc(GetTamanioID());
	CargarID(IDBuscada,NULL,IdBuscado);
	char* IDIndexada=(char*) malloc(GetTamanioID());
	CargarID(IDIndexada,NULL,IdIndexado);

	int comparacion=memcmp(IDBuscada,IDIndexada,GetTamanioClave());

	free(IDBuscada);
	free(IDIndexada);

	return comparacion;
}
*/
char *DatoIndice::GetDato(char *dato, unsigned int id)
{
	char* aux=(char*) malloc(GetTamanioClave()+GetTamanioID());
	memset(aux,0,GetTamanioClave()+GetTamanioID());

	CargaClave(aux, dato);

	CargarID(aux+GetTamanioClave(), dato, id);

	return aux;
}


int DatoIndice::CompararClave(const char *clave, int tamanio, char *InformacionIndexada)
{
	char* claveBuscada=(char*) malloc(GetTamanioClave());
	memset(claveBuscada,0,GetTamanioClave());
	memcpy(claveBuscada,clave,tamanio);


	int comparacion=memcmp(claveBuscada,InformacionIndexada,GetTamanioClave());

	free(claveBuscada);

	return comparacion;
}

DatoIndice::~DatoIndice()
{
}

int DatoIndice::GetTamanioID()
{
	if(EsPrimario())
		return 4;
	return primaryKey->GetTamanio();
}



int DatoIndice::GetTamanioClave()
{
	if(EsPrimario())
		return primaryKey->GetTamanio();
	return secondaryKey->GetTamanio();
}



bool DatoIndice::EsPrimario()
{
	return secondaryKey==NULL;
}

Key *DatoIndice::GetKey()
{
	if(EsPrimario())
		return primaryKey;
	return secondaryKey;
}

unsigned int DatoIndice::GetID(char *informacion)
{
	unsigned int id;
	memcpy(&id, informacion+GetTamanioClave(),4);
	return id;
}

char *DatoIndice::GetClavePrimaria(char *informacion)
{
	char* clave=(char*) malloc(GetTamanioID());
	memcpy(clave,informacion+GetTamanioClave(),GetTamanioID());
	return clave;
}

void DatoIndice::CargarID(char *destino, char *informacion, unsigned int id)
{
	if(EsPrimario())
	{
		memcpy(destino,& id,4);
	}
	else
	{
		int tamanio;
		char* clave=primaryKey->GetKey(informacion,tamanio);
		memcpy(destino,clave,tamanio<GetTamanioID()? tamanio:GetTamanioID());
		free(clave);
	}
}



void DatoIndice::CargaClave(char *destino, char *informacion)
{
	int tamanio;

	char* clave=GetKey()->GetKey(informacion,tamanio);
	memcpy(destino,clave,tamanio<GetTamanioClave()? tamanio:GetTamanioClave());
	free(clave);
}






